﻿#include <stdio.h>
#include <stdlib.h>
#include "bd/bd.h"
#include "carro/carro.h"
#include "ui/ui.h"
#include "util/util.h"
#include "admin/admin.h"
#ifdef _WIN32
#include <windows.h>
#endif

void archivo(void),literp2(void),subsub(void);//,salir(void);
void cerrar(void);
void cambiarpass(void);
int login(void);

nodo_producto * prodInicial=NULL,*prodFinal=NULL;
nodo_usuario * usrInicial=NULL,*usrFinal=NULL;

menu MenuPrincipal[] =
{
//  Nombre del menu, funcion, descripcion, id usuario necesaria
    {"Usuario",archivo, "Menus de usuario",3},
    {"Carro",menuCarro,"Pagina de Compra",2},
    {"Administracion",admin,"Administracion",0},
    {"", 0, "",0 }   //siempre hay que agregar este item a los menus
};

menu SubMenu0[] =
{
    { "Cambiar password", cambiarpass, "Cambiar el password del usuario logeado",2 },
    { "Informe", cerrar, "Informe de ventas diario, semanal o mensual",2 },
    { "Guardar BD", guardarBD, "Actualiza ahora los archivos de la base de datos",2 },
    { "Cerrar sesion", cerrar, "Cerrar sesion",3 },
    { "", 0, "" ,0}
};

void cerrar(void)
{
    salir(1);
}

void archivo(void)
{
    mostrar_menu(SubMenu0);
}

void cambiarpass(void)
{
    char ** resp=NULL;
    char *preg[]= {"Password antigua","Password nueva","Confirme",NULL};
    while((resp=obtener_datos(preg,"Ingrese password antigua luego ingrese la nueva y confirme, ESC para cancelar",30,3)))
    {
        if((strcmp(resp[0],vendActual->pass)==0)&&resp[1]!='\0'&&resp[2]!='\0'&&(strcmp(resp[1],resp[2])==0))
        {
            free(vendActual->pass);
            free(resp[0]);
            free(resp[1]);
            vendActual->pass=resp[2];
            preg_error("Password cambiada exitosamente!!",0);
            break;
        }
        else preg_error("Ingrese los datos correctos!!",1);
    }
}

#ifdef _WIN32
void moverventana(void)
{
    HWND Consola;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO conf;
    typedef HWND WINAPI (*GetConsoleWindowT)(void);
    GetConsoleWindowT GetConsoleWindow;
    HMODULE hK32Lib = GetModuleHandle(TEXT("KERNEL32.DLL"));
    GetConsoleWindow = (GetConsoleWindowT)GetProcAddress(hK32Lib,TEXT("GetConsoleWindow"));
    if ( GetConsoleWindow == NULL ) {
         return;
    }
    Consola = GetConsoleWindow();
    GetConsoleScreenBufferInfo(hStdOut, &conf);
    MoveWindow(Consola,1,1,conf.dwSize.X*9,conf.dwSize.Y*13,1);
}
#endif

int login()
{
    nodo_usuario * test;
    char *campos[] =
    {
        "Nombre de usuario", "Password",(char *)0
    };
    char *admin[] =
    {
        "Password","Confirme",(char *)0
    };
    int max = 30;
    estad ini= {0,0};
    res_busq_u *usuario;
    char **resp=NULL;
    char *mensaje;
    nodo_usuario *usr=(nodo_usuario *)malloc(sizeof(nodo_usuario));
    inicializar();
    #ifdef _WIN32
    moverventana();
    #endif
    if(!usrInicial)
    {
        preg_error("Ingrese password del Administrador\n Usuario sera: admin",0);
        while((resp=obtener_datos(admin,"Ingrese password del Administrador, ESC para salir",max,2)))
        {
            if(strcmp(resp[0],resp[1])==0)
            {
                usr->nombre=(char *) malloc(sizeof("admin"));
                strcpy(usr->nombre,"admin");
                usr->pass=resp[0];
                usr->id=0;
                usr->sig=NULL;
                usr->mes_act=ini;
                usr->mes_ant=ini;
                usr->mes_ant2=ini;
                usr->dia=ini;
                usr->semana=ini;
                usr->total=0;
                agregarUsr(usr);
                cerrarBd();
                inicializarBd(&usrInicial,&prodInicial);
                break;
            }
            else preg_error("Passwords no coinciden",1);
        }
        if(!resp)
            return -1;
    }
    //obtiene respuestas para preguntas en fieldname, con largo maximo field
    mensaje="Ingrese nombre de usuario y pass, ESC para salir";
    while((resp=obtener_datos(campos,mensaje,max,1)))
    {
        usr->nombre=resp[0];
        usr->pass=resp[1];
        if(resp[0][0]!='\0'&&resp[1][0]!='\0'&&(usuario=buscarUsr(usr,2))&&(strcmp(usr->pass,(usuario->usr)->pass)==0))
        {
            //hay que verificar ..!='\0' por la funcion de busqueda...
            //si encuentra el usuario con esa contraseña
            char *tipo;
            switch((usuario->usr)->id)
            {
            case 0:
                tipo="Administrador";
                break;
            case 1:
                tipo="Vendedor";
                break;
            default:
                tipo="Invitado";
                break;
            }
            vendActual=usuario->usr;
            titulo(tipo,vendActual->nombre);
            return (usuario->usr)->id;
        }
        else
        {
            liberar_char_array(resp);
            preg_error("Nombre de usuario o password incorrecta",1);
            mensaje="Nombre de usuario o password incorrecta, ESC para salir";
        }
        test=usuario->usr;
    }
    return -1;
}

int main()
{
    //system("chcp 850");
    int usr_id,bds;
    inicializarBd(&usrInicial,&prodInicial);
    if((int)usrInicial==-1||(int)prodInicial==-1)
    {
        fprintf(stderr,"ERROR EN LA BASE DE DATOS!!!\n");
        printf("U:%i P:%i",(int)usrInicial,(int)prodInicial);
        getc(stdin);
    }
    else
    {
        fflush(stdin);
        while((usr_id=login())!=-1)
        {
            if(!prodInicial)
                preg_error("No hay productos en la base de datos",1);
            iniciar_menu(MenuPrincipal,usr_id);
            usr_id=0;
            salir(0);
        }
        if(usr_id==-1)
            finalizar(); //finaliza curses
        bds=cerrarBd();
        if((bds&1)==1||(bds&2)==2)
            fprintf(stderr,"ERROR AL GUARDAR LA BASE DE DATOS. U: %i, P: %i ",(bds&1)==1,(bds&2)==2);
    }
    return 0;
}
